iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
Security

從零開始學資訊安全系列 第 13

從零開始學資訊安全-DAY13:資料串流加密演算法-RC4

  • 分享至 

  • xImage
  •  

今天來學習對稱式加密的資料串流加密演算法-RC4
此演算法的金鑰可成可短,首先先初始化一個S盒,然後透過偽隨機生成算法,不斷透過交換S盒的元素並計算K值來計算偽隨機密鑰流

def KSA(key):
    """密鑰調度算法 (KSA) - 初始化S盒"""
    key_length = len(key)
    S = list(range(256))
    j = 0
    for i in range(256):
        j = (j + S[i] + key[i % key_length]) % 256
        S[i], S[j] = S[j], S[i]  # 交换S[i]和S[j]
    return S

def PRGA(S, length):
    """偽隨機生成算法 (PRGA) - 生成偽隨機密鑰流"""
    i = 0
    j = 0
    keystream = []
    for _ in range(length):
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]  # 交换S[i]和S[j]
        k = S[(S[i] + S[j]) % 256]
        keystream.append(k)
    return keystream

使用RC4演算法對給定的明文進行加密。它透過產生偽隨機金鑰流,然後將明文與金鑰流進行XOR運算,以產生密文
反之,將密文與金鑰進行XOR運算,便可解密出明文

def RC4(key, plaintext):
    """RC4加密"""
    S = KSA(key)
    keystream = PRGA(S, len(plaintext))
    
    ciphertext = []
    for i in range(len(plaintext)):
        ciphertext_byte = plaintext[i] ^ keystream[i]
        ciphertext.append(ciphertext_byte)
    
    return bytes(ciphertext)

def RC4_decrypt(key, ciphertext):
    """RC4解密"""
    return RC4(key, ciphertext)  # RC4加密和解密使用相同的算法

範例

if __name__ == "__main__":
    key = b"hahaha"  # 密鑰(二進制)
    plaintext = "Hello"  # 要加密的明文

加密

    ciphertext = RC4(key, plaintext.encode())
    print("密文:", ciphertext)

解密

 decrypted_text = RC4_decrypt(key, ciphertext)
    print("明文:", decrypted_text.decode())

結果

密文: b'3\x13\x16\x06\\'
明文: Hello

心得:雖然這個加密方法後來被廢掉了...但還是流行了一段時間,教師節快樂~~


上一篇
從零開始學資訊安全-DAY12:古典密碼學和現代密碼學
下一篇
從零開始學資訊安全-DAY14:AES-GCM
系列文
從零開始學資訊安全30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言